\section{Herramienta}

La clase Herramienta se encarga de representar a cada una de las herramientas personalizadas o por defecto de {\em Label Pro}. Esta clase, cumple con dos funciones: la de representar cada uno de los elementos del menu Explorador y la de representar, en  el momento de definirlas, cada una de las Etiquetas de las que se compone el etiquetador. Para ello se ha creado la clase mencionada, que implementa funciones que tienen en comun cada una de las etiquetas. Dichas funciones pueden ser, saber si una herramienta ha sido presionada en el menu lateral derecho o mostrar su activador por pantalla.
Existen ciertos par\'ametros relacionados con las dimensiones de la imagen que interaccionan con las etiquetas, como por ejemplo el zoom que hemos realizado sobre dicha im\'agen o la cantidad de pixels que la hemos desplazado. Estos par\'ametros son una cosa que se debe tener en cuenta a la hora de dibujar o comprovar si se han presionado las etiquetas, ya que las coordenadas de la etiqueta deben ser las absolutas en la im\'agen y no las relativas de la pantalla. Es por ello, que se almacenan los parametros de zoom en ambos ejes y el desplazamiento para, mediante una regla de tres poder hayar la posici\'on absoluta de la etiqueta en la im\'agen. Una vez que se ha acabado de crear una etiqueta,la clase Herramiena se encarga de crear una instancia del objeto Etiqueta y, la interfaz, la guarda en la lista de etiquetas de la im\'agen actual.

Como todas las herramientas son almacenadas en una lista hetereogenea, la clase Herramienta tambien implementa algunos m\'etodos para que as\'i, cada una de las clases de etiqueta pueda sobreescribirlos. Algunos de dichos metodos s\'on, los que devuelven el texto de ayuda a la clase Helper o el que muestra por pantalla la etiqueta. A continuaci\'on se muestran las diferentes herramientas de las que disponemos:

\section{Cuadrado}

La clase cuadrado sobrescribe todos los m\'etodos de su clase madre Herramienta, adem\'as de a\~{n}adir alguno m\'as, como son los m\'etodos que dan la posibilidad de a\~{n}adir restricciones, tanto de ancho como de alto, a nuestras etiquetas cuadradas. Algo que puede causar la confusion de algunos usuarios es el nombre de dicha clase, ya que no solamente permite la definicion de cuadrados, sin\'o que tambien permite definir rectangulos.

\pagebreak

Para mostrar el estado actual de la etiqueta que se est\'a definiendo en ese momento, el sistema almacena el punto donde el usuario ha presionado por primera vez y dibuja dicho rectangulo con origen el punto donde presion\'o el usuario y como dimensiones la diferencia de posiciones respecto a la posici\'on actual del rat\'on y el punto definido por el usuario. Para el proceso mencionado anteriormente no se pueden obiar los par\'ametros que interfieren en la posici\'on de las etiquetas.

\begin{center}
$width$=$(((mouseX-dragX-\frac{\frac{(width-offsetx)}{2})}{zoom}))-x$ \\
$height$=$(((mouseY-dragY-\frac{\frac{(height-offsety)}{2})}{zoomy}))-y$\\
\end{center}
\section{Circulo}

La clase circulo sobrescribe todos los m\'etodos de su clase madre Herramienta, adem\'as de a\~{n}adir alguno m\'as, como es el m\'etodo que da la posibilidad de a\~{n}adir la restricci\'on de radio a nuestras etiquetas circulares.

Para mostrar el estado actual de la etiqueta que se est\'a definiendo, el sistema almacena la primera posici\'on que el usuairio defini\'o y la asigna al centro de la circunferencia. Seguidamente calcula el radio de la circunferencia con la siguiente f\'ormula:

\begin{center}
$x_1$=mouseX
$y_1$=mouseY
$x_2$=$((((mouseX-dragX)-\frac{\frac{(width-offsetx)}{2})}{zoom}))$
$y_2$=$((((mouseY-dragY)-\frac{\frac{(height-offsety)}{2})}{zoomy}))$
$radio$=$\left |{\sqrt[2]{(x2-x)^2+(y2-y)^2}}\right |$
\end{center}
\section{Pol\'igono}

La clase pol\'igono sobrescribe todos los m\'etodos de su clase madre Herramienta, adem\'as de a\~{n}adir alguno m\'as, como es el m\'etodo que da la posibilidad de a\~{n}adir la restricci\'on de n\'umero de lados a nuestras etiquetas poligonales.

Para mostrar el estado actual de la etiqueta que se est\'a definiendo, el sistema almacena en una lista las posiciones absolutas, las coordenadas del rat\'on que ha ido definiendo el usuario para posteriormente, dibujar una linea entre cada pareja de puntos que pertenece a la lista. Por \'ultimo, dibuja una linea entre la posici\'on actual del rat\'on y la \'ultima posici\'on definida en la lista.

\pagebreak

Podemos definir la f\'ormula que dibuja el pol\'igono actual como:
\begin{center}
\[ \forall i \in lista \land  i \ne 0 \]
line(lista[i][0],lista[i][1],lista[i-1][0],lista[i-1][1])
\end{center}

\section{Punto}

La clase punto sobrescribe todos los m\'etodos de su clase madre Herramienta.
Para mostrar el estado actual de la etiqueta que se est\'a definiendo en ese momento, dibujamos un punto en la posici\'on actual del rat\'on.

\section{Secuencia de puntos}

La clase secuencia de puntos sobrescribe todos los m\'etodos de su clase madre Herramienta, adem\'as de a\~{n}adir alguno m\'as, como es el m\'etodo que da la posibilidad de a\~{n}adir la restricci\'on de n\'umero de puntos a nuestras secuencias.

Para mostrar el estado actual de la etiqueta que se est\'a definiendo, el sistema almacena en una lista las posiciones absolutas, que ha ido definiendo el usuario para posteriormente, dibujar en todas las posiciones de la lista un punto. Podemos definir la ecuaci\'on que dibuja el estado actual de la secuencia como:

\begin{center}
\[ \forall i \in lista \]
point(lista[i][0],lista[i][1])
\end{center}

\pagebreak

